﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using EControl.Controle;
using EControl.Modelo;

namespace EControl
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        private User UsuarioLogado;
        private string PesquisaClientes = "";
        private bool IsClienteJuridico;
        private bool IsClienteAvulso;

        public MainWindow()
        {
            InitializeComponent();
            grdMenuLateral.Visibility = System.Windows.Visibility.Hidden;
            txtUsuario.Focus();
            lblTituloInterface.Content = "Login";
            resetTodos();
        }

        #region login

        private void btnEntrar_Click(object sender, System.Windows.RoutedEventArgs e)
        {
            try
            {
                //Login do usuário no sistema
                Usuario usuario = new Usuario();

                string login, senha;
                login = txtUsuario.Text;
                senha = txtSenha.Password;

                bool validacao;
                validacao = usuario.validaLogin(login, senha);

                User user = new User();

                if (validacao)
                {
                    user = usuario.logarUsuario(login, senha);

                    if (user != null)
                    {
                        UsuarioLogado = user;
                        fechaLogin();
                        if (!user.IsAdmin)
                        {
                            btnConfiguracoes.Visibility = System.Windows.Visibility.Hidden;
                        }

                        mostraEntradaSaida();
                    }
                    else
                    {
                        MessageBoxButton botao = MessageBoxButton.OK;
                        MessageBox.Show("Usuário ou senha incorretos.", "Erro", botao);
                    }
                }
            }
            catch (Exception)
            {
                MessageBoxButton botao = MessageBoxButton.OK;
                MessageBox.Show("Ocorreu um erro! Contate o administrador do sistema ou tente novamente mais tarde.", "Erro", botao);
                throw;
            }
        }

        #endregion

        #region controle das janelas

        private void btnFechar_Click(object sender, RoutedEventArgs e)
        {
            this.Close();
        }

        private void fechaLogin()
        {
            grdMenuLateral.Visibility = System.Windows.Visibility.Visible;
            grpLogin.Visibility = System.Windows.Visibility.Hidden;
        }

        private void Rectangle_MouseLeftButtonDown(object sender, System.Windows.Input.MouseButtonEventArgs e)
        {
            DragMove();
        }

        private void Rectangle_MouseLeftButtonDown_1(object sender, System.Windows.Input.MouseButtonEventArgs e)
        {
            DragMove();
        }

        private void lblTituloInterface_MouseLeftButtonDown(object sender, System.Windows.Input.MouseButtonEventArgs e)
        {
            DragMove();
        }

        // os eventos abaixo nao permitem o botao ser desmarcado

        private void btnEntradaSaida_Click(object sender, RoutedEventArgs e)
        {
            mostraEntradaSaida();
        }

        private void btnClientes_Click(object sender, RoutedEventArgs e)
        {
            mostraClientes();
        }

        private void btnConfiguracoes_Click(object sender, RoutedEventArgs e)
        {
            mostraConfiguracoes();
        }

        //controle de exibiçao dos menus

        private void resetTodos()
        {
            grdClientes.Visibility = System.Windows.Visibility.Hidden;
            resetClientes();
            grdEntradaSaida.Visibility = System.Windows.Visibility.Hidden;
            resetEntradaSaida();
        }

        private void mostraEntradaSaida()
        {
            btnEntradaSaida.IsChecked = true;

            btnClientes.IsChecked = false;
            btnConfiguracoes.IsChecked = false;

            lblTituloInterface.Content = "Entrada / Saída";
            resetTodos();
            grdEntradaSaida.Visibility = System.Windows.Visibility.Visible;
        }

        private void resetEntradaSaida()
        {
            grdEScadastro.Visibility = System.Windows.Visibility.Visible;
            grdESticket.Visibility = System.Windows.Visibility.Hidden;
        }

        private void mostraClientes()
        {
            btnClientes.IsChecked = true;

            btnEntradaSaida.IsChecked = false;
            btnConfiguracoes.IsChecked = false;

            lblTituloInterface.Content = "Clientes";
            resetTodos();
            grdClientes.Visibility = System.Windows.Visibility.Visible;
        }

        private void resetClientes()
        {
            grdClientesList.Visibility = System.Windows.Visibility.Visible;
            grdClientesEditar.Visibility = System.Windows.Visibility.Hidden;
            grdClientesNovo.Visibility = System.Windows.Visibility.Hidden;
        }

        private void mostraConfiguracoes()
        {
            btnConfiguracoes.IsChecked = false;

            ConfigWindow window = new ConfigWindow();
            window.ShowDialog();
        }

        #endregion

        #region cliente

        // Pesquisa de clientes
        private void grdClientesList_IsVisibleChanged(object sender, DependencyPropertyChangedEventArgs e)
        {
            pesquisar();
        }

        private void pesquisar()
        {
            ClienteController clienteCon = new ClienteController();
            List<ClienteModel> clientes = new List<ClienteModel>();

            clientes = clienteCon.pesquisar(PesquisaClientes);

            listCli.Items.Clear();

            foreach (ClienteModel cliente in clientes)
            {
                listCli.Items.Add(cliente);
            }
        }

        private void btnCliPesquisar_Click(object sender, RoutedEventArgs e)
        {
            PesquisaClientes = txtCliPesquisa.Text;
            pesquisar();
        }

        // Novo cliente
        private void btnCliNovo_Click(object sender, RoutedEventArgs e)
        {
            grdClientesList.Visibility = System.Windows.Visibility.Hidden;
            grdClientesNovo.Visibility = System.Windows.Visibility.Visible;

            txtCliNovoNome.Text = "";
            txtCliNovoCpf.Text = "";
            rbdCliNovoPf.IsChecked = true;
            IsClienteJuridico = false;
        }

        private void btnCliNovoVoltar_Click(object sender, RoutedEventArgs e)
        {
            grdClientesList.Visibility = System.Windows.Visibility.Visible;
            grdClientesNovo.Visibility = System.Windows.Visibility.Hidden;
        }

        private void rbdCliNovoPf_Click(object sender, RoutedEventArgs e)
        {
            lblCliNovoNome.Content = "Nome";
            lblCliNovoCpf.Content = "CPF";
            IsClienteJuridico = false;
        }

        private void rbdCliNovoPj_Click(object sender, RoutedEventArgs e)
        {
            lblCliNovoNome.Content = "Razão social";
            lblCliNovoCpf.Content = "CNPJ";
            IsClienteJuridico = true;
        }

        private bool validaCliente(ClienteModel cliente)
        {
            return true;
        }

        private void btnCliNovoCadastrar_Click(object sender, RoutedEventArgs e)
        {
            ClienteModel cliente = new ClienteModel();

            cliente.Nome = txtCliNovoNome.Text;
            cliente.Cpf = txtCliNovoCpf.Text;
            cliente.IsJuridico = IsClienteJuridico ? "1" : "0";
           
            if (validaCliente(cliente))
            {
                ClienteController clienteCon = new ClienteController();

                clienteCon.novoCliente(cliente);

                grdClientesList.Visibility = System.Windows.Visibility.Visible;
                grdClientesNovo.Visibility = System.Windows.Visibility.Hidden;
            }
        }

        // Editar cliente
        private void rbdCliEditPf_Click(object sender, RoutedEventArgs e)
        {
            IsClienteJuridico = false;
            lblCliEditNome.Content = "Nome";
            lblCliEditCpf.Content = "CPF";
        }

        private void rbdCliEditPj_Click(object sender, RoutedEventArgs e)
        {
            IsClienteJuridico = true;
            lblCliEditNome.Content = "Razão social";
            lblCliEditCpf.Content = "CNPJ";
        }

        private void btnCliEditVoltar_Click(object sender, RoutedEventArgs e)
        {
            grdClientesEditar.Visibility = System.Windows.Visibility.Hidden;
            grdClientesList.Visibility = System.Windows.Visibility.Visible;
        }

        private void btnCliEditar_Click(object sender, RoutedEventArgs e)
        {
            ClienteModel cliente = new ClienteModel();
            cliente = null;

            if (listCli.SelectedIndex > -1)
            {
                cliente = (ClienteModel)listCli.SelectedItems[0];
            }

            if (cliente == null)
            {
                MessageBoxButton botao = MessageBoxButton.OK;
                MessageBox.Show("Por favor selecione um cliente", "Aviso", botao);
            }
            else
            {
                ClienteController clienteCon = new ClienteController();
                cliente = clienteCon.pesquisaCliente(cliente.Id);

                lblCliEditId.Content = cliente.Id;
                IsClienteJuridico = cliente.IsJuridico == "Pessoa jurídica" ? true : false;
                txtCliEditCPF.Text = cliente.Cpf;
                txtCliEditNome.Text = cliente.Nome;
                if (IsClienteJuridico)
                {
                    rbdCliEditPj.IsChecked = true;
                    lblCliEditNome.Content = "Razão social";
                    lblCliEditCpf.Content = "CNPJ";
                }
                else
                {
                    rbdCliEditPf.IsChecked = true;
                    lblCliEditNome.Content = "Nome";
                    lblCliEditCpf.Content = "CPF";
                }

                grdClientesEditar.Visibility = System.Windows.Visibility.Visible;
                grdClientesList.Visibility = System.Windows.Visibility.Hidden;
            }
        }

        private void btnCliEditSalvar_Click(object sender, RoutedEventArgs e)
        {
            ClienteModel cliente = new ClienteModel();

            cliente.Id = lblCliEditId.Content.ToString();
            cliente.Nome = txtCliEditNome.Text;
            cliente.Cpf = txtCliEditCPF.Text;
            cliente.IsJuridico = IsClienteJuridico ? "1" : "0";
            
            if (validaCliente(cliente))
            {
                ClienteController clienteCon = new ClienteController();

                clienteCon.atualizaCliente(cliente);

                grdClientesList.Visibility = System.Windows.Visibility.Visible;
                grdClientesEditar.Visibility = System.Windows.Visibility.Hidden;
            }
        }

        #endregion

        #region entradaSaida

        private void grdEScadastro_IsVisibleChanged(object sender, DependencyPropertyChangedEventArgs e)
        {
            txtESCpf.Text = "";
            txtESPlaca.Text = "";

            rbdESAvulso.IsChecked = true;
            IsClienteAvulso = true;

            VeiculoController veiculoCon = new VeiculoController();

            lblESVagasUso.Content = veiculoCon.vagasEmUso().ToString();
            lblESVagasDispo.Content = veiculoCon.vagasDisponiveis().ToString();

            lblESCPF.Visibility = System.Windows.Visibility.Hidden;
            txtESCpf.Visibility = System.Windows.Visibility.Hidden;
        }

        private void rbdESAvulso_Click(object sender, RoutedEventArgs e)
        {
            IsClienteAvulso = true;

            lblESCPF.Visibility = System.Windows.Visibility.Hidden;
            txtESCpf.Visibility = System.Windows.Visibility.Hidden;
        }

        private void rbdESMensalista_Click(object sender, RoutedEventArgs e)
        {
            IsClienteAvulso = false;

            lblESCPF.Visibility = System.Windows.Visibility.Visible;
            txtESCpf.Visibility = System.Windows.Visibility.Visible;
        }

        private void btnESEnter_Click(object sender, RoutedEventArgs e)
        {
            VeiculoController veiculoCon = new VeiculoController();

            string placa = txtESPlaca.Text;

            if (!veiculoCon.existeEntrada(placa))
            {
                //Entrada de veículo

                if ((string)lblESVagasDispo.Content == "0")
                {
                    MessageBoxButton botao = MessageBoxButton.OK;
                    MessageBox.Show("Não temos vagas disponíveis", "Erro", botao);
                }
                else
                {
                    if (IsClienteAvulso)
                    {
                        // Entrada cliente avulso

                        VeiculoModel veiculo = new VeiculoModel();
                        veiculo.Placa = placa;

                        veiculo = veiculoCon.entradaAvulso(veiculo);

                        if (veiculo == null)
                        {
                            resetEntradaSaida();
                        }
                        else
                        {
                            mostraTicket(veiculo, true);
                        }
                    }
                    else
                    {
                        // Entrada cliente mensalista

                        VeiculoModel veiculo = new VeiculoModel();
                        veiculo.Placa = placa;
                        veiculo.ClienteCpf = txtESCpf.Text;

                        veiculo = veiculoCon.entradaMensalista(veiculo);

                        if (veiculo == null)
                        {
                            resetEntradaSaida();
                        }
                        else
                        {
                            mostraTicket(veiculo, true);
                        }
                    }
                }
            }
            else
            {
                if (IsClienteAvulso)
                {
                    // Saida cliente avulso

                    VeiculoModel veiculo = new VeiculoModel();
                    veiculo.Placa = placa;

                    veiculo = veiculoCon.saidaAvulso(veiculo);

                    if (veiculo == null)
                    {
                        resetEntradaSaida();
                    }
                    else
                    {
                        mostraTicket(veiculo, false);
                    }
                }
                else
                {
                    // Saida cliente mensalista

                    VeiculoModel veiculo = new VeiculoModel();
                    veiculo.Placa = placa;

                    veiculo = veiculoCon.saidaMensalista(veiculo);

                    if (veiculo == null)
                    {
                        resetEntradaSaida();
                    }
                    else
                    {
                        mostraTicket(veiculo, false);
                    }
                }
            }
        }

        private void mostraTicket(VeiculoModel veiculo, bool isEntrada)
        {
            if (isEntrada)
            {
                lblESTicket.Content = "ENTRADA DE VEÍCULO";
            }
            else
            {
                lblESTicket.Content = "SAÍDA DE VEÍCULO";
            }
            

            lblESPlaca.Content = veiculo.Placa;
            lblESCPFCliente.Content = veiculo.ClienteCpf;
            lblESNome.Content = veiculo.ClienteNome;
            lblESVaga.Content = veiculo.Vaga;
            lblESEntrada.Content = veiculo.Entrada;
            lblESSaida.Content = veiculo.Saida;
            lblESTotalPagar.Content = veiculo.TotalPago;

            grdEScadastro.Visibility = System.Windows.Visibility.Hidden;
            grdESticket.Visibility = System.Windows.Visibility.Visible;
        }

        private void btnESFinalizar_Click(object sender, RoutedEventArgs e)
        {
            grdEScadastro.Visibility = System.Windows.Visibility.Visible;
            grdESticket.Visibility = System.Windows.Visibility.Hidden;
        }

        #endregion

        
    }
}
